package code17_reflect;

import java.io.IOException;
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.util.Properties;

public class TestAnnotation {

	public static void main(String[] args) throws Exception {
		//f1();
		
		Stu stu = new Stu();
		set(stu, "stu.properties");
		System.out.println(stu);
		
		System.out.println("-----------");
		Person p = new Person();
		set(p, "stu.properties");
		System.out.println(p);
	}
	/**
	 * 根据注解配置和属性文件, 设置指定对象指定属性的值<br>
	 * 使用注解配置去属性文件中获取对应的值, 把值设置到注解所在的属性上<br>
	 * @param obj
	 * @param fileName 相对类路径的地址
	 */
	public static void set(Object obj, String fileName){
		// 加载文件
		Properties p = new Properties();
		try {
			p.load(TestAnnotation.class.getClassLoader().getResourceAsStream(fileName));
			
			Class<?> c = obj.getClass();
			
			Field[] fields = c.getDeclaredFields();
			for (Field f : fields) {
				// 找有此注解的属性, 进行赋值操作
				Value valueAnno = f.getAnnotation(Value.class);
				if (null != valueAnno) {
					// 获取key
					String key = valueAnno.value();
					// 获取 value
					String val = p.getProperty(key);
					
					// 可访问
					f.setAccessible(true);
					// 获取属性类型
					Class<?> type = f.getType();
					// 设置该属性的值
					if (type == String.class) {
						f.set(obj, val);
					} else if (type == int.class) {
						// 把 String --> int
						int m = Integer.parseInt(val);
						f.set(obj, m);
					} else {
						// 其他不考虑
					}
				}
			}
			
		} catch (IOException e) {
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		}
		
	}

	private static void f1() throws Exception {
		Class<?> c = Stu.class;
		
		// 获取类上的注解
		Annotation[] arr1 = c.getAnnotations();
		for (Annotation anno : arr1) {
			System.out.println(anno);
		}
		System.out.println("-------------");
		
		Field nameField = c.getDeclaredField("name");
		// 获取当前位置上的指定类型的注解
		MyAnn01 ann01 = nameField.getAnnotation(MyAnn01.class);
		// 获取到注解对象后, 和普通对象的用法相同
		int age = ann01.age();
		Class<?>[] cArr = ann01.cArr();
		String value = ann01.value();
		// 获取注解的属性值, 进行对应的功能的实现
		
		// 判断当前位置是否存在某个注解
		MyAnn01 ann02 = c.getAnnotation(MyAnn01.class);
		System.out.println(null != ann02);
		
		boolean present = c.isAnnotationPresent(MyAnn01.class);
		System.out.println("present:"+present);
	}
	
}
